// -*- IDL -*-

/**
 * @file IFR_Base.pidl
 *
 * This file is used to generate the code in IFR_BaseC.{h,i,cpp}.
 * The original file Interface.idl was split into four pieces, to
 * keep the generated files to a manageable size and reduce build
 * time. This IDL file contains the abstract base interfaces of
 * the IFR as well as many of the non-interface data types used
 * by all other IFR interfaces.
 */

#ifndef _IFR_BASE_IDL_
#define _IFR_BASE_IDL_

#include "tao/orb.idl"

module CORBA
{
  typeprefix CORBA "omg.org";

  typedef string ScopedName;

  enum DefinitionKind
  {
    dk_none,
    dk_all,
    dk_Attribute,
    dk_Constant,
    dk_Exception,
    dk_Interface,
    dk_Module,
    dk_Operation,
    dk_Typedef,
    dk_Alias,
    dk_Struct,
    dk_Union,
    dk_Enum,
    dk_Primitive,
    dk_String,
    dk_Sequence,
    dk_Array,
    dk_Repository,
    dk_Wstring,
    dk_Fixed,
    dk_Value,
    dk_ValueBox,
    dk_ValueMember,
    dk_Native,
    dk_AbstractInterface,
    dk_LocalInterface,
    dk_Component,
    dk_Home,
    dk_Factory,
    dk_Finder,
    dk_Emits,
    dk_Publishes,
    dk_Consumes,
    dk_Provides,
    dk_Uses,
    dk_Event
  };

  interface IRObject
  {
    // read interface
    readonly attribute DefinitionKind def_kind;

    // write interface
    void destroy ();
  };

  typedef string VersionSpec;

  interface Contained;
  interface Repository;
  interface Container;

  interface Contained : IRObject
  {
    // read/write interface
    attribute RepositoryId id;
    attribute Identifier name;
    attribute VersionSpec version;

    // read interface
    readonly attribute Container defined_in;
    readonly attribute ScopedName absolute_name;
    readonly attribute Repository containing_repository;

    struct Description
    {
      DefinitionKind kind;
      any value;
    };

    Description describe ();

    // write interface
    void move (
        in Container new_container,
        in Identifier new_name,
        in VersionSpec new_version
      );
  };

  interface ModuleDef;
  interface ConstantDef;
  interface IDLType;
  interface StructDef;
  interface UnionDef;
  interface EnumDef;
  interface AliasDef;

  interface InterfaceDef;
  typedef sequence<InterfaceDef> InterfaceDefSeq;

  interface ExceptionDef;
  interface NativeDef;

  interface ValueDef;
  typedef sequence<ValueDef> ValueDefSeq;

  interface ValueBoxDef;

  interface AbstractInterfaceDef;
  typedef sequence<AbstractInterfaceDef> AbstractInterfaceDefSeq;

  interface LocalInterfaceDef;
  typedef sequence<LocalInterfaceDef> LocalInterfaceDefSeq;

  interface ExtInterfaceDef;
  typedef sequence <ExtInterfaceDef> ExtInterfaceDefSeq;

  interface ExtValueDef;
  typedef sequence <ExtValueDef> ExtValueDefSeq;

  interface ExtAbstractInterfaceDef;
  typedef sequence <ExtAbstractInterfaceDef>

  ExtAbstractInterfaceDefSeq;
  interface ExtLocalInterfaceDef;

  typedef sequence <ExtLocalInterfaceDef>
  ExtLocalInterfaceDefSeq;

  typedef sequence <Contained> ContainedSeq;

  struct StructMember
  {
    Identifier name;
    TypeCode type;
    IDLType type_def;
  };

  typedef sequence <StructMember> StructMemberSeq;

  struct Initializer
  {
    StructMemberSeq members;
    Identifier name;
  };

  typedef sequence <Initializer> InitializerSeq;

  struct ExceptionDescription
  {
    Identifier name;
    RepositoryId id;
    RepositoryId defined_in;
    VersionSpec version;
    TypeCode type;
  };

  typedef sequence <ExceptionDescription> ExcDescriptionSeq;

  struct ExtInitializer
  {
    StructMemberSeq members;
    ExcDescriptionSeq exceptions;
    Identifier name;
  };

  typedef sequence <ExtInitializer> ExtInitializerSeq;

  struct UnionMember
  {
    Identifier name;
    any label;
    TypeCode type;
    IDLType type_def;
  };

  typedef sequence <UnionMember> UnionMemberSeq;
  typedef sequence <Identifier> EnumMemberSeq;

  interface Container : IRObject
  {
    // read interface
    Contained lookup (
        in ScopedName search_name
      );
    ContainedSeq contents (
        in DefinitionKind limit_type,
        in boolean exclude_inherited
      );
    ContainedSeq lookup_name (
        in Identifier search_name,
        in long levels_to_search,
        in DefinitionKind limit_type,
        in boolean exclude_inherited
      );
    struct Description
    {
      Contained contained_object;
      DefinitionKind kind;
      any value;
    };

    typedef sequence<Description> DescriptionSeq;

    DescriptionSeq describe_contents (
        in DefinitionKind limit_type,
        in boolean exclude_inherited,
        in long max_returned_objs
      );

    // write interface

    ModuleDef create_module (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version
      );

    ConstantDef create_constant (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in IDLType type,
        in any value
      );

    StructDef create_struct (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in StructMemberSeq members
      );

    UnionDef create_union (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in IDLType discriminator_type,
        in UnionMemberSeq members
      );

    EnumDef create_enum (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in EnumMemberSeq members
      );

    AliasDef create_alias (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in IDLType original_type
      );

    InterfaceDef create_interface (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in InterfaceDefSeq base_interfaces
      );

    ValueDef create_value (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in boolean is_custom,
        in boolean is_abstract,
        in ValueDef base_value,
        in boolean is_truncatable,
        in ValueDefSeq abstract_base_values,
        in InterfaceDefSeq supported_interfaces,
        in InitializerSeq initializers
      );

    ValueBoxDef create_value_box(
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in IDLType original_type_def
      );

    ExceptionDef create_exception(
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in StructMemberSeq members
      );

    NativeDef create_native(
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version
      );

    AbstractInterfaceDef create_abstract_interface (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in AbstractInterfaceDefSeq base_interfaces
      );

    LocalInterfaceDef create_local_interface (
        in RepositoryId id,
        in Identifier name,
        in VersionSpec version,
        in InterfaceDefSeq base_interfaces
      );

    ExtValueDef create_ext_value ( in RepositoryId id,
                                   in Identifier name,
                                   in VersionSpec version,
                                   in boolean is_custom,
                                   in boolean is_abstract,
                                   in ValueDef base_value,
                                   in boolean is_truncatable,
                                   in ValueDefSeq abstract_base_values,
                                   in InterfaceDefSeq supported_interfaces,
                                   in ExtInitializerSeq initializers );
  };

  interface IDLType : IRObject
  {
    readonly attribute TypeCode type;
  };

  interface TypedefDef : Contained, IDLType
  {
  };

  struct TypeDescription
  {
    Identifier name;
    RepositoryId id;
    RepositoryId defined_in;
    VersionSpec version;
    TypeCode type;
  };
};

#endif /* _IFR_BASE_IDL_ */
